package team.api;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import org.apache.log4j.Logger;

import study.itwill.common.DBHandler;
import team.item.boardItem;

/**
 * CRUD 처리를 하는 클래스 만들기
 * ------------------------------------------------------------------------------
 * 데이터 입출력이 필요한 기능에 대하여,
 * CREATE, READ, UPDATE, DELETE에 해당하는 메소드를
 * 구현해 놓는 처리를 말한다.
 * ------------------------------------------------------------------------------
 * CREATE --> SQL의 INSERT 구문을 실행한다.
 * READ   --> SQL의 SELECT 구문을 실행한다.
 * UPDATE --> SQL의 UPDATE 구문을 실행한다.
 * DELETE --> SQL의 DELETE 구문을 실행한다.
 * ------------------------------------------------------------------------------
 * CRUD에 해당하는 기능들은 어떤 데이터 처리를 목적으로 하는지가 정해져야한다
 * 
 * ex) 학생 데이터의 입출력
 *     교수 데이터의 입출력
 *     회원 데이터의 입출력
 *     게시물 데이터의 입출력
 *     카테고리 데이터의 입출력
 *     상품 데이터의 입출력
 * ------------------------------------------------------------------------------
 * 메소드들의 이름은 "동사" + "목적어" 형식으로 작성한다
 * ex) 학생 데이터의 입출력인 경우
 *    --> insertboard, updateboard, deleteboard, selectboard
 * ------------------------------------------------------------------------------
 * insert 기능의 경우, 각 데이터를 판별할 수 있는
 * 고유한 값(PK)를 제외하고 INSERT에 처리한 모든 값들을 메소드 파라미터로 전달받아야한다
 * 데이터 형은 테이블 구조를 참조하면 된다
 * 
 * 메소드의 수행 결과는 새롭게 추가된 데이터의 일련번호(seq)를 리턴해 주어야 한다
 * ------------------------------------------------------------------------------
 * update, delete의 경우 결과를 리턴해 주어야 한다
 * --> boolean 값을 리턴한다.
 * 
 * UPDATE, DELETE는 각 데이터를 판별할 수 있는 고유한 값(PK)를 파라미터로 전달 받는다
 * 그 외에 추가적으로 일괄 삭제나, 일괄 수정등을 목적으로 할 경우 상황에 따라
 * 파라미터 형태를 변경할 수 있다.
 * ------------------------------------------------------------------------------
 * 이 클래스들은 DATABASE 접속이 성공 한 이후에 호출된다고 가정되어야 한다. 
 */

public class board {
	
	static Logger logger = Logger.getLogger(board.class);
	
	private static final String TABLE = "board";
	
	
	public int insertboard(String board_name) {
		// ---------------------------------------------
		// 메소드 시작
		// ---------------------------------------------
		logger.debug("=================== method start >> insertboard");		
		
		logger.debug("[PARAMS] board_name = " + board_name);		
		
		// SQL 인젝션 방어
		board_name = board_name.replace("'" , "\'");			
		
		// 트렌젝션에 대한 판단이 잘 서지 않는다면,
		// 무조건 하면 된다.
		DBHandler.beginTrans();
		
		// INSERT 처리를 위한 구현
		String sql = "INSERT INTO board("
				   + "board_name,reg_date,edit_date"				   
				   + ") VALUES ("
				   + "'%s', now() , now());";
		
		boolean result = DBHandler.execSql(sql, board_name);
		int seq = 0;
		
		// -----------------------------------------------------------------
		// 결과처리
		// -----------------------------------------------------------------
		
		if (result) {			
			DBHandler.commit();
			 seq = DBHandler.getMax(TABLE, "seq", null);
			logger.debug("처리결과 >> " + seq + "번 게시판 등록 성공");
		} else {
			DBHandler.rollback();
			logger.debug("처리결과 >> 데이터 추가 실패");
		}
		
		logger.debug("===================== method end >> insertboard");
		
		return seq;
		
	}
	
	public boolean updateboard(int seq , String board_name) {
		
		logger.debug("=================== method start >> insertboard");
		
		logger.debug("[PARAMS] seq = " + seq);
		logger.debug("[PARAMS] board_name = " + board_name);			
		
		// 리턴할 값 선언
		boolean result = false;		

		// SQL 인젝션 방어
		board_name = board_name.replace("'" , "\'");		
		
		// 트렌젝션에 대한 판단이 잘 서지 않는다면,
		// 무조건 하면 된다.
		DBHandler.beginTrans();
		
		String sql = "UPDATE board "
				   + "set board_name = '%s' , edit_date = now() "				   
				   + "WHERE seq = %d;";
		
	   result = DBHandler.execSql(sql, board_name,seq);
		
		// ---------------------------------------------
		// 결과처리
		// ---------------------------------------------
		
		if (result) {
			DBHandler.commit();
			logger.debug("처리결과 >> " + seq + "번 게시판 수정 성공");
		} else {
			DBHandler.rollback();
			logger.debug("처리결과 >> 데이터 삭제 실패");
		}
		
		logger.debug("=========== method end >> updateboard");
				
		return result;
	}
	
	public boolean deleteboard(int seq) {
		logger.debug("======================== method start >> deleteseq");
		logger.debug("[PARAMS] seq = " + seq);
		
		boolean result = false;
		
		DBHandler.beginTrans();
		
		String sql = "DELETE FROM board WHERE seq = %d";
		result = DBHandler.execSql(sql , seq);
		
		if (result) {
			DBHandler.commit();
			logger.debug("처리결과 >> " + seq + "번 게시판 삭제 성공");
		} else {
			DBHandler.rollback();
			logger.debug("처리결과 >> 데이터 삭제 실패");
		}
		
		logger.debug("============================ method end >> deleteseq");
				
		return result;
	}

	/**
	 * 학생 한명의 데이터를 조회하여 리턴하는 메소드
	 * 
	 * @param seq
	 * @return boardItem
	 */

	public boardItem selectboard(int seq) {
		logger.debug("======================== method start >> selectboard");
		logger.debug("[PARAMS] seq = " + seq);

		boardItem item = null;

		// 데이터조회

		String sql = "SELECT seq , board_name , reg_date , edit_date "
				+ "From board "
				+ "WHERE seq = %d";

		ResultSet rs = DBHandler.getResult(sql , seq);

		if (rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				rs.next();

				// 1) ResultSet의 모든 데이터를 변수로 추출

				int sno = rs.getInt(1);
				String board_name = rs.getString(2);
				String reg_date = rs.getString(3);
				String edit_date = rs.getString(4);
				

				// 2) 추출된 값을 객체로 구성
				item = new boardItem(sno, board_name, reg_date, edit_date);

			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 3) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {
				}
				rs = null;
			}

		}

		if (item == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공");
			logger.debug(item.toString());
		}

		logger.debug("================== method end >> selectboard");

		return item;
	}
	
	/**
	 * 학생목록의 데이터를 조회하여 리턴하는 메소드
	 * @param stduno
	 * @return ArrayList<boardItem>
	 */
	
	public ArrayList<boardItem> selectboardList(int seq) {
		logger.debug("================== method start >> selectboard");
		
		ArrayList<boardItem> list = null;
		
		// 데이터 조회
		
		String sql = "SELECT seq , board_name , reg_date , edit_date "				 
				+ "From board ";
				
				
		// 파라미터에 따라서 검색조건 지정
		
		if (seq > 0) {
			sql += " WHERE seq='" + seq + "'";
		}
		
		ResultSet rs = DBHandler.getResult(sql);
		
		if (rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<boardItem>();
				
				while (rs.next()) {
					
					// 1) ResultSet의 모든 데이터를 변수로 추출

					int sno = rs.getInt(1);
					String board_name = rs.getString(2);
					String reg_date = rs.getString(3);
					String edit_date = rs.getString(3);
					
					
					// 2) 추출된 값을 객체로 구성
					boardItem item = new boardItem(sno, board_name, reg_date, edit_date);
					
					// 3) ArrayList에 추가
					list.add(item);
					
				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if (list == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공 >> " + list.size() + "건 조회됨");
		}
		
		logger.debug("================== method end >> selectboard");
		
		return list;	
		
	}
	
	
	

}
